Railsのフォームでajaxでメソッドを叩いて値を更新する
なんて書けば良いのかわかんないけど、
Railsでつくったフォームの入力値をとってきて、
(フォームは送信せず)
なんかメソッドたたいて、返って来た値をつかって
フォームを更新する、みたいなことがやりたかった。
すごい簡単にいうと、インターネット上で住所入力するとき、
郵便番号いれて、住所がぱぱっと入力されるみたいなやつが
やりたかった。
メソッドも自分でつくります。
フォームの値をとってくる
これはJSでできる!
Railsは適当にJS読み込んでくれるので、
そこに書く。
ここを参考にした。
<%= f.text_field :url%>
というフォームがもともとあって、
<%= f.text_field :url , :id => 'url' %>
こんな感じで書くとよい。
idを指定するだけではうまくいかなかったので、
getElementByIdをつかった。
alertまたはconsole.logで確認しておく。
メソッドの準備
メソッドのルーティングをしておく。
getメソッドにする。
クエリで受け取るので、その変数をurlとすると、
params[:url]でメソッド側から受け取れる。
処理を書いて、最終的にテキストで今回は出すので、
render text:"テキスト"
と書いておく。
メソッドがちゃんと動作するか、
直接叩いて確認しておく。
~/メソッドのroute?url=hogehoge
のようにブラウザに入れて、"テキスト"がページに出ればOKです。
このときparams[:url]はhogehogeになります。
【参考にしたページ】
Railsでレスポンスを返すメソッドについての簡単勉強メモ - light log
実はここが一番つまったところ。
Ajax処理を書く
フォームはそのまま送信せず残しているので、
Ajaxでメソッドを叩きます。上でかいているJSの続きに書けばOKです。
$.ajax({
type: "GET",
data: 'url=' + url_string,
success: function(data) {
成功したときの処理
},
error: function() {
失敗したときの処理
}
という感じにかきます。これは上のメソッドで受け取る形にあわせているので、
dataのところは自分の好きなようにしてください。
url_stringは最初のJSで取得したデータを入れている変数です。
ajaxでtypeをGETにすると、クエリでうまく渡せるようです。
上でrenderにしたテキストをsuccessのdataで受け取れます。
【参考にしたページ】
ダメ男のブログ: Ruby on Rails3でlink_toでAjax処理
最後にJSで値を入れる
successのdataにメソッドからrenderで指定した値がはいっているので、
最後にまたgetElementByIdで値をいれます。
ちょっと時間がかかるので、ぐるぐるなんかだせるといいですねー
Ruby on Rails ~もくもくAjax~
初めてKyoto.rbに参加しました。
前回のdeviseの導入のつづき、
Railsのログイン認証gemのDeviseのカスタマイズ方法 - Rails Webook
をやった。
日本語ローカライズのリンク切れだったので、
第15回: Devise によるユーザー認証機能の日本語化(1) - Ruby on Rails 3.0 日記 - Ruby on Rails with OIAX
ここからもらった。
あとURLからページのタイトルを取得したくて、
Nokogiri を使った Rubyスクレイピング [初心者向けチュートリアル] - 酒と泪とRubyとRailsと
nokogiriなるものを導入。
これをajaxつかってページに表示させたい、というところでタイムオーバー。
1.5h一瞬だった。
Ruby on Rails ~devise奮闘編~
Ruby on Railsはじめました
細かいことはさておき。
ログイン認証"devise"をいれる!
Railsの一番人気のログイン認証gemのDeviseの導入方法 - Rails Webook
これやってます。
まずひっかっかったの。"bundle install"すると、
Could not find gem 'device (>= 0) ruby' in the gems available on this machine.
これは、gemfileに"device"とかいていたせいでした…
つぎ。
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby extconf.rb
creating Makefile
make "DESTDIR="
xcrun: error: active developer path ("/Applications/Xcode 2.app/Contents/Developer") does not exist, use xcode-select to change
Gem files will remain installed in /var/folders/7c/mxb436gn589f9d6dz7bfq7z80000gn/T/bundler20150301-11365-1boopry/bcrypt-3.1.10/gems/bcrypt-3.1.10 for inspection.
Results logged to /var/folders/7c/mxb436gn589f9d6dz7bfq7z80000gn/T/bundler20150301-11365-1boopry/bcrypt-3.1.10/gems/bcrypt-3.1.10/ext/mri/gem_make.out
これに関しては、
sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer
することで解決。
さらに、"rake db:migrate"で失敗。
エラーメッセージは
rake aborted!
NoMethodError: undefined method `devise' for User
こんなかんじ。
これは、
rails generate devise:install
することで解決した。
db:migrateすると、railsの再起動が必要らしいので、
再起動してやると、先のページのようなログイン機能が実装されました!
PHPアプリをHerokuにデプロイできた!
の続き。
何が問題だったかというと、logをみたら解決した。
logの見方は
heroku logs
でOK,
Call to undefined function mb_detect_encoding() in hoge.php on line 93
ってかいてあったので、"mb_detect_encoding() heroku"を調べると、
Heroku: PHP Fatal error for valid function - mb_check_encoding - Stack Overflow
"mbstring"をいれるべし、ということなので、
"mbstring heroku"で検索。
こちらを参考にさせてもらって、
{
"require": {
"ext-mbstring": "*"
}
}
をcomposer.jsonに書いた。
次に、またlogがエラーはいていた。
Call to undefined function imagecreatetruecolor() in hoge.php on line 16
だそうで、"imagecreatetruecolor()"はGDだな、ということがピンときて、
composer.jsonに
{
"require": {
"ext-mbstring": "*",
"ext-gd": "*"
}
}
こんな感じで追記。
やっとうまくいきましたー!!!
iConpeito - iPhone/iPad icon maker
こちらが、今回アップしたものです!!!
やった〜〜〜
PHPの正規表現でHTMLからタイトルを抽出
$subject = file_get_contents(URL);
if (preg_match_all("/<title>(.*?)<\/title>/s", $subject, $match) ){
echo $match[1][0]."<br>";
}else{
echo "no match.<br>"; }
って感じでタイトルだけ表示できました!
$matchという配列が意味不明で、
$match[0]はさらに空のArrayが入っていて、
$match[1]もArrayがはいっていて、そのArray[0]に結果がいました。
このへんは要勉強。
参考サイト
[Q&A] 正規表現で特定のHTMLタグのクラスから文字列を取り出したい 【OKWave】 : http://okwave.jp/qa/q5069941.html